﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using ProjetPacman;

namespace pacman
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        SpriteFont textFont;

        private Pacman pacman;
        private Fantome forceJaune;
        private Fantome forceRouge;
        private Fantome forceBleue;
        private Fantome forceRose;

        private int niveau;
        private int score;
        private Levels level;
        private int nbVie;

        public int NbVie
        {
            get { return nbVie; }
            set { nbVie = value; }
        }
        public bool freeze;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Permet au jeu d’effectuer l’initialisation nécessaire pour l’exécution.
        /// Il peut faire appel aux services et charger tout contenu
        /// non graphique. Calling base.Initialize énumère les composants
        /// et les initialise.
        /// </summary>
        protected override void Initialize()
        {
            freeze = true;
            niveau = 1;
            score = 0;
            nbVie = 3;
            pacman = new Pacman(Content, niveau);
            level = new Levels(Content, niveau);
            forceJaune = new Fantome(Content, Fantome.GOLD, level, niveau);
            forceRouge = new Fantome(Content, Fantome.RED, level, niveau);
            forceBleue = new Fantome(Content, Fantome.BLUE, level, niveau);
            forceRose = new Fantome(Content, Fantome.PINK, level, niveau);
            base.Initialize();
        }

        /// <summary>
        /// LoadContent est appelé une fois par partie. Emplacement de chargement
        /// de tout votre contenu.
        /// </summary>

        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            //  changing the back buffer size changes the window size (when in windowed mode)
            graphics.PreferredBackBufferWidth = 1024;
            graphics.PreferredBackBufferHeight = 660;
            graphics.ApplyChanges();
        }



        /// <summary>
        /// UnloadContent est appelé une fois par partie. Emplacement de déchargement
        /// de tout votre contenu.
        /// </summary>
        protected override void UnloadContent()
        {
            
        }

        /// <summary>
        /// Permet au jeu d’exécuter la logique de mise à jour du monde,
        /// de vérifier les collisions, de gérer les entrées et de lire l’audio.
        /// </summary>
        /// <param name="gameTime">Fournit un aperçu des valeurs de temps.</param>
        protected override void Update(GameTime gameTime)
        {
            // Permet au jeu de se fermer
            if (Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
            int temp;
            if (!freeze)
            {
                temp = pacman.Update(gameTime, level);
                score += temp;
                if (temp == 50)//pacgum eaten
                {
                    pacman.ChangeEtat();
                    forceJaune.ChangeEtat();
                    forceRouge.ChangeEtat();
                    forceBleue.ChangeEtat();
                    forceRose.ChangeEtat();
                }
                /*temp = forceJaune.Update(gameTime, level, pacman.Position);
                temp += forceRouge.Update(gameTime, level, pacman.Position);
                temp += forceBleue.Update(gameTime, level, pacman.Position);
                temp += forceRose.Update(gameTime, level, pacman.Position);*/
                temp = 0;
                if (temp > 0)
                {
                    nbVie--;
                    if (nbVie < 0)
                    {
                        //GAME OVER
                    }
                    pacman.Direction = Pacman.DEAD;
                    level.reset();
                    pacman.reset(niveau);
                    forceJaune.reset(niveau,Fantome.GOLD);
                    forceRouge.reset(niveau,Fantome.RED);
                    forceBleue.reset(niveau,Fantome.BLUE);
                    forceRose.reset(niveau,Fantome.PINK);
                    freeze = true;
                }
            }
            else
            {
                KeyboardState keyboard= Keyboard.GetState();
                if (keyboard.IsKeyDown(Keys.Right) || keyboard.IsKeyDown(Keys.Left) || 
                    keyboard.IsKeyDown(Keys.Up) || keyboard.IsKeyDown(Keys.Down))
                {
                    freeze = false;
                }
            }
            base.Update(gameTime);
        }

        /// <summary>
        /// Appelé quand le jeu doit se dessiner.
        /// </summary>
        /// <param name="gameTime">Fournit un aperçu des valeurs de temps.</param>


        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();
            level.Draw(spriteBatch);

            long duree;
            if (!freeze) duree = gameTime.ElapsedGameTime.Milliseconds;
            else duree = 0;

            pacman.Draw(spriteBatch, duree);
            forceJaune.Draw(spriteBatch, duree);
            forceRouge.Draw(spriteBatch, duree);
            forceBleue.Draw(spriteBatch, duree);
            forceRose.Draw(spriteBatch, duree);

            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}
